home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / disgas / disgas.c next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  5.4 KB  |  220 lines

  1. /*** DISGAS.C   (c) S.Enjoji ***/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <ctype.h>
  7.  
  8. int getdata(void);
  9. void code0f(void);
  10. void operand(int t, char *p);
  11.  
  12. struct mnem {
  13.     char type;
  14.     char opsize;
  15.     char opra;
  16.     char oprb;
  17.     char oprc;
  18.     char dmy;
  19.     char *opcode;
  20. };
  21.  
  22. extern char *multimn[7][8];
  23. extern struct mnem mntab[];
  24. extern struct mnem mn0ftab[];
  25.  
  26. char code[80],op1[32],op2[32],op3[32],dump[40];
  27. int mod, reg, rm, op32, ad32, oprsize, fdump;
  28. unsigned long addr;
  29. FILE *fp;
  30. char *opctale[3] = {"B", "W", "L"};
  31.  
  32. main(int argc,char *argv[])
  33. {
  34.     char sw;
  35.     int c,d,n,s,t;
  36.     unsigned long start,end,qaddr;
  37.  
  38.     if (argc<2) {                            /* パラメータの数が少なすぎる */
  39.         puts("Parameter error !\a\n");
  40.         puts("usage:disgas [-d] [-sHex_num] [-eHex_num] [-aHex_num] File");
  41.         puts("             s:Start offset   e:End offset");
  42.         puts("             a:Address        d:Dump switch");
  43.         exit(1);
  44.     }
  45.     op32 = 1;
  46.     ad32 = 1;
  47.     addr = 0L;
  48.     start = 0L;
  49.     end = 0xffffffffL;
  50.     fdump = 0;
  51.     c = 1;
  52.     while(argv[c][0] == '-') {                /* オプションスイッチのチェック */
  53.         sw = tolower(argv[c][1]);
  54.         if(sw == 'd') {
  55.             fdump = 1;
  56.         } else if(sw == 's') {
  57.             if(argv[c][2]) sscanf(&argv[c][2], "%lx", &start);
  58.             else sscanf(argv[++c], "%lx", &start);
  59.         } else if(sw == 'e') {
  60.             if(argv[c][2]) sscanf(&argv[c][2], "%lx", &end);
  61.             else sscanf(argv[++c], "%lx", &end);
  62.         } else if(sw == 'a') {
  63.             if(argv[c][2]) sscanf(&argv[c][2], "%lx", &addr);
  64.             else sscanf(argv[++c], "%lx", &addr);
  65.         }
  66.         c++;
  67.     }
  68.     end += addr - start;
  69.     if((fp=fopen(argv[c],"rb")) == NULL) {    /* ファイルがない */
  70.         puts("File not exist !\a\n");
  71.         exit(1);
  72.     }
  73.     printf("%s\n",argv[c]);
  74.     fseek(fp, start, SEEK_SET);
  75.     while( (c = getc(fp)) != EOF && addr <= end) {
  76.         qaddr = addr;
  77.         addr++;
  78.         sprintf(dump,"%02X",c);
  79.         s = mntab[c].opsize;                /* オペランドサイズの決定 */
  80.         if(s == 1) oprsize = 0;
  81.         else if (s == 2 && op32 == 1) oprsize = 2;
  82.         else oprsize = 1;
  83.         if(mntab[c].opra == 2 || mntab[c].oprb == 2) {    /* modrm の展開 */
  84.             d = getdata();
  85.             rm = d % 8;
  86.             reg = (d >> 3) % 8;
  87.             mod = d >> 6;
  88.         }
  89.         n = 2;
  90.         t = mntab[c].type;                    /* オペコードの決定 */
  91.         if(t == 0) {                        /* プリフィックス */
  92.             if(c == 0x66) {
  93.                 op32 = 0;
  94.             } else if(c == 0x67) {
  95.                 ad32 = 0;
  96.             }
  97.             strcpy(code, mntab[c].opcode);
  98.             n--;
  99.         } else if(t == 1) {                    /* オペランド無し */
  100.             strcpy(code, mntab[c].opcode);
  101.             n--;
  102.         } else if(t <= 4) {                    /* 1~3オペランド語尾有り */
  103.             sprintf(code, "%s%s", mntab[c].opcode, opctale[oprsize]);
  104.             n = t;
  105.         } else if(t == 5) {                    /* 1オペランド語尾無し */
  106.             strcpy(code, mntab[c].opcode);
  107.         } else if(t == 8) {
  108.             code0f();
  109.             n--;
  110.         } else if(t == 9) {
  111.             sprintf(code, ".byte   0x%02x", c);
  112.             n--;
  113.         } else if(t == 10 || t == 11) {
  114.             sprintf(code, "%s%s", multimn[t-10][reg], opctale[oprsize]);
  115.             n++;
  116.         } else if(t == 12) {
  117.             sprintf(code, "%s%s", multimn[2][reg], opctale[oprsize]);
  118.             if(!reg) n++;
  119.         } else if(t == 13) {
  120.             if(reg <= 1 || reg == 6) {
  121.                 sprintf(code, "%s%s", multimn[3][reg], opctale[oprsize]);
  122.             } else {
  123.                 strcpy(code, multimn[3][reg]);
  124.             }
  125.         }
  126.         if(t) {
  127.             op32 = 1;
  128.             ad32 = 1;
  129.         }
  130.         if(n == 2) {                /* オペコード、オペランド文字列の作成 */
  131.             operand(mntab[c].opra,op1);
  132.             sprintf(code,"%-8s%s",code,op1);
  133.         } else if(n == 3) {
  134.             operand(mntab[c].opra,op2);
  135.             operand(mntab[c].oprb,op1);
  136.             sprintf(code,"%-8s%s,%s",code,op1,op2);
  137.         } else if(n == 4) {
  138.             operand(mntab[c].opra,op3);
  139.             operand(mntab[c].oprb,op2);
  140.             operand(mntab[c].oprc,op1);
  141.             sprintf(code,"%-8s%s,%s,%s",code,op1,op2,op3);
  142.         }
  143.         if(fdump) {
  144.             printf("_%08lx: %-40s #%s\n",qaddr,strlwr(code),dump);
  145.         } else {
  146.             printf("_%08lx: %s\n",qaddr,strlwr(code));
  147.         }
  148.     }
  149.     fclose(fp);
  150. }
  151.  
  152. int getdata()
  153. {
  154.     int d;
  155.  
  156.     if((d = getc(fp)) == EOF) {
  157.         fclose(fp);
  158.         exit(1);
  159.     }
  160.     addr++;
  161.     if(fdump) sprintf(dump,"%s %02X",dump,d);
  162.     return d;
  163. }
  164.  
  165. void code0f(void)
  166. {
  167.     int c,d,s,n,t;
  168.  
  169.     c = getdata();
  170.     s = mn0ftab[c].opsize;                    /* オペランドサイズの決定 */
  171.     if(s == 1) oprsize = 0;
  172.     else if (s == 2 && op32 == 1) oprsize = 2;
  173.     else oprsize = 1;
  174.     if(mn0ftab[c].opra == 2 || mn0ftab[c].oprb == 2) {    /* modrm の展開 */
  175.         d = getdata();
  176.         rm = d % 8;
  177.         reg = (d >> 3) % 8;
  178.         mod = d >> 6;
  179.     }
  180.     t = mn0ftab[c].type;                    /* オペコードの決定 */
  181.     if(t == 1) {                            /* オペランド無し */
  182.         strcpy(code, mn0ftab[c].opcode);
  183.         n = 1;
  184.     } else if(t <= 4) {                        /* 1~3オペランド語尾有り */
  185.         sprintf(code, "%s%s", mn0ftab[c].opcode, opctale[oprsize]);
  186.         n = t;
  187.     } else if(t == 5) {                        /* 1オペランド語尾無し */
  188.         strcpy(code, mn0ftab[c].opcode);
  189.         n = 2;
  190.     } else if(t == 6) {                        /* 2オペランド語尾無し */
  191.         strcpy(code, mn0ftab[c].opcode);
  192.         n = 3;
  193.     } else if(t == 14 || t == 15) {
  194.         strcpy(code, multimn[t-10][reg]);
  195.         n = 2;
  196.     } else if(t == 16) {
  197.         strcpy(code, multimn[6][reg]);
  198. /*        sprintf(code, "%s%s", multimn[6][reg], opctale[oprsize]);*/
  199.         n = 3;
  200.     } else {
  201.         sprintf(code, ".byte   0x0f,0x%02x", c);
  202.         n = 1;
  203.     }
  204.     op32 = 1;
  205.     ad32 = 1;
  206.     if(n == 2) {                    /* オペコード、オペランド文字列の作成 */
  207.         operand(mn0ftab[c].opra,op1);
  208.         sprintf(code,"%-8s%s",code,op1);
  209.     } else if(n == 3) {
  210.         operand(mn0ftab[c].opra,op2);
  211.         operand(mn0ftab[c].oprb,op1);
  212.         sprintf(code,"%-8s%s,%s",code,op1,op2);
  213.     } else if(n == 4) {
  214.         operand(mn0ftab[c].opra,op3);
  215.         operand(mn0ftab[c].oprb,op2);
  216.         operand(mn0ftab[c].oprc,op1);
  217.         sprintf(code,"%-8s%s,%s,%s",code,op1,op2,op3);
  218.     }
  219. }
  220.